OpenGL中如何绘制Bezier曲线和NURBS曲线

您所在的位置:网站首页 opengl 画曲线 OpenGL中如何绘制Bezier曲线和NURBS曲线

OpenGL中如何绘制Bezier曲线和NURBS曲线

2023-09-30 05:56| 来源: 网络整理| 查看: 265

一、Bezier曲线

      主要注意两个函数:glMap1和glEvalCoord1。

1.void glMap1{fd}(GLenum target,TYPE u1,TYPE u2,GLint stride, GLint order,const TYPE *points); 功能:定义求值器。 

参数:target:指出了控制顶点的意义以及在points参数中需要提供多少值。

         points:可以指向控制点集、RGBA颜色值或是纹理坐标串等。

         u1、u2:限定了变量U的取值范围,通常是从0变化到1。

         stride:表示跨度(在每块存储区内浮点数或双精度数的个数,即两个控制点间的偏移量)。

         order:阶数,等于次数加1,与控制点数相等。

2.void glEvalCoord1{fd}[v](TYPE u)。功能:该函数将产生曲线坐标值并将其绘制。

参数:u:为定义域内的任意值,每调用一次将只产生一个坐标,此坐标值也是任意的。

      但目前较多采用的是定义均匀间隔曲线坐标值,依次调用glMapGrid1*()和glEvalMesh1()可以获得等间隔值。这两个函数分别用来定义一个一维网格和计算相应的坐标值。

      另外,曲线定义后必须再glEnable()函数显式启动后才能起作用,其参数与target保持一致。在使用完毕后通过glDisable()函数将其关闭。

view plaincopy to clipboardprint?01.#include    02.#include    03.GLfloat ctrlpoints[9][3] = {{0,-0.2,0},{-1.2,-0.5,0},{-1.6,-1,0},{-1.4,-1.5,0},   04.{-1,-2.2,0},{-0.5,-2.7,0},{-0.35,-3.2,0},{-0.6,-3.7,0},{-1.6,-4.2,0}};//控制点   05.  06.void init(void)   07.{   08.   glClearColor(0.0, 0.0, 0.0, 0.0);   09.   glShadeModel(GL_FLAT);   10.   glMap1f(GL_MAP1_VERTEX_3, 0.0, 1.0, 3, 9, &ctrlpoints[0][0]);   11.   glEnable(GL_MAP1_VERTEX_3);   12.}   13.void display(void)   14.{   15.   int i;   16.   glClear(GL_COLOR_BUFFER_BIT);   17.   glColor3f(1.0, 1.0, 1.0);   18.   glBegin(GL_POINTS);//(GL_LINE_STRIP);   19.      for (i = 0; i    glClearColor(0.0, 0.0, 0.0, 0.0);   glShadeModel(GL_FLAT);   glMap1f(GL_MAP1_VERTEX_3, 0.0, 1.0, 3, 9, &ctrlpoints[0][0]);   glEnable(GL_MAP1_VERTEX_3);}void display(void){   int i;   glClear(GL_COLOR_BUFFER_BIT);   glColor3f(1.0, 1.0, 1.0);   glBegin(GL_POINTS);//(GL_LINE_STRIP);      for (i = 0; i    switch (key) {      case 27:         exit(0);         break;   }}int main(int argc, char** argv){   glutInit(&argc, argv);   glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);   glutInitWindowSize (500, 500);   glutInitWindowPosition (100, 100);   glutCreateWindow (argv[0]);   init ();   glutDisplayFunc(display);   glutReshapeFunc(reshape);   glutKeyboardFunc (keyboard);   glutMainLoop();   return 0;} 

 

二、NURBS曲线

      主要注意函数:1.void gluNurbsCurve(GLUnurbsObj *nobj, GLint nknots, GLfloat *knot, Glint stride, GLfloat *ctlarray, GLint order,GLenum type)

功能:定义曲线形状。参数:nobj:指向NURBS对象的指针。      nknots:节点数,节点数=控制点数+阶数。     knot:nknots数组非递减节点值。     stride:跨度,相邻控制点的偏移量。     Ctlarry:指向NURBS的控制点数组的指针。     order:NURBS曲线的阶数,阶数=次数+1。     type:曲线、面类型。

2.void gluNurbsProperty(GLUnurbsObj* nobj, GLenum property, GLfloat value)

功能:设置NURBS属性。

参数:nobj:指向NURBS对象的指针。     property:需设置的属性。     value:设置指定属性的值。

3.gluBeginCurve、gluEndCurve限定NURBS曲面。返回值均为void,参数均为GLUnurbsObj* nobj,为指向NURBS对象的指针。

view plaincopy to clipboardprint?01.#include    02.#include    03.  04.GLUnurbsObj *theNurb;   05.GLfloat ctrlpoints[9][3] = {{0,-0.2,0},{-1.2,-0.5,0},{-1.6,-1,0},{-1.4,-1.5,0},   06.{-1,-2.2,0},{-0.5,-2.7,0},{-0.35,-3.2,0},{-0.6,-3.7,0},{-1.6,-4.2,0}};//控制点   07.GLfloat color[9][3]={{1.0,0.0,0.0},{1.0,1.0,0.0},{0.0,1.0,0.0},{-1.0,1.0,0.0},   08.{-1.0,0.0,0.0},{-1.0,-1.0,0.0},{0.0,-1.0,0.0},{1.0,-1.0,0.0},{1.0,-1.0,0.0}};   09.  10.void myInit(void)   11.{   12.    glClearColor(1.0,1.0,1.0,0.0);//设置背景色   13.    theNurb = gluNewNurbsRenderer();//创建NURBS对象theNurb   14.    gluNurbsProperty(theNurb,GLU_SAMPLING_TOLERANCE,10);   15.}   16./*绘制曲线*/  17.void myDisplay(void)   18.{   19.    int i;   20.    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);   21.    glColor3f(0.0,0.0,0.0);   22.    glLineWidth(3.0);   23.    /*绘制曲线*/  24.    gluBeginCurve(theNurb);   25.    gluNurbsCurve(theNurb,13,knots,3,&ctrlpoints[0][0],4,GL_MAP1_VERTEX_3);   26.    gluNurbsCurve(theNurb,13,knots,3,&color[0][0],4,GL_MAP1_COLOR_4);   27.    gluEndCurve(theNurb);   28.    /*绘制点*/  29.    glColor3f(1.0,0.0,0.0);   30.    glPointSize(5.0);   31.    glBegin(GL_POINTS);   32.    for(i = 0;i < 9;i++)   33.        glVertex2fv(&ctrlpoints[i][0]);   34.    glEnd();   35.    glutSwapBuffers();   36.}   37.void myReshape(GLsizei w,GLsizei h)   38.{   39.    glViewport(0,0,w,h);   40.    glMatrixMode(GL_PROJECTION);   41.    glLoadIdentity();   42.    if(w {1.0,0.0,0.0},{1.0,1.0,0.0},{0.0,1.0,0.0},{-1.0,1.0,0.0},{-1.0,0.0,0.0},{-1.0,-1.0,0.0},{0.0,-1.0,0.0},{1.0,-1.0,0.0},{1.0,-1.0,0.0}};

void myInit(void){ glClearColor(1.0,1.0,1.0,0.0);//设置背景色 theNurb = gluNewNurbsRenderer();//创建NURBS对象theNurb gluNurbsProperty(theNurb,GLU_SAMPLING_TOLERANCE,10);}/*绘制曲线*/void myDisplay(void){ int i; glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glColor3f(0.0,0.0,0.0); glLineWidth(3.0); /*绘制曲线*/ gluBeginCurve(theNurb); gluNurbsCurve(theNurb,13,knots,3,&ctrlpoints[0][0],4,GL_MAP1_VERTEX_3); gluNurbsCurve(theNurb,13,knots,3,&color[0][0],4,GL_MAP1_COLOR_4); gluEndCurve(theNurb); /*绘制点*/ glColor3f(1.0,0.0,0.0); glPointSize(5.0); glBegin(GL_POINTS); for(i = 0;i < 9;i++)  glVertex2fv(&ctrlpoints[i][0]); glEnd(); glutSwapBuffers();}void myReshape(GLsizei w,GLsizei h){ glViewport(0,0,w,h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); if(w



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3